package org.springframework.beans.factory.config;



import org.springframework.core.AttributeAccessor;

import java.util.List;

/**
 * 一切始于bd
 */
public interface BeanDefinition extends AttributeAccessor {
    String SCOPE_SINGLETON = "singleton";//单例
    String SCOPE_PROTOTYPE = "prototype";//多例
    int ROLE_APPLICATION = 0;
    int ROLE_SUPPORT = 1;
    int ROLE_INFRASTRUCTURE = 2;
    Class<?> getBeanClass();
    void setBeanClass(Class<?> beanClass);

    //单多例域
    String getScope();
    void setScope(String scope);


    boolean isSingleton();//是否单例
    boolean isPrototype();//是否多例

    //懒加载
    void setLazyInit(boolean lazyInit);
    boolean isLazyInit();

    //postConstructor方法
    String getInitMethodName();
    void setInitMethodName(String initMethodName);

    //DI属性
    List<PropertyValue> getPropertyValues();
    void setPropertyValues(List<PropertyValue> propertyValues);

    //装配模式
    int getResolvedAutowireMode();
    void setResolvedAutowireMode(int autowireMode);

    //构造器参数
    List<?> getConstructorArgumentValues();
    boolean hasConstructorArgumentValues();
    List<PropertyValue> getConstructorArgumentPropertyValues();
    void setConstructorArgumentPropertyValues(List<PropertyValue> constructorArgumentPropertyValues);

    //true表示当遇到两个权重一样的构造器选择第一个
    //false表示当遇到两个权重一样的构造器抛异常
    boolean isLenientConstructorResolution();
    void setLenientConstructorResolution(boolean lenientConstructorResolution);

    int getRole();
    void setRole(int role);

    //@Bean+static
    String getFactoryMethodName();
    void setFactoryMethodName(String factoryMethodName);

    //@Bean+instance
    String getFactoryBeanName();
    void setFactoryBeanName(String factoryBeanName);

}
